﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;
using System.IO;

using YoungEnterpriseServices;
using Model;
using Interface;

namespace Controller
{
    public class MainController
    {
        MesseCollection messeListe = new MesseCollection();
        // Opret Kategori
        // Koble metode og gui sammen gemmen controller og interfaces-
        Messe aktuelMesse;
        Kategori aktuelKategori;
        Konkurrence aktuelKonkurrence;

        #region Creation

        public MainController()
        {
            aktuelMesse = new Messe();
        }

        #endregion

        #region Kategori metoder

        public List<IKategori> HentKategorier(IKonkurrence aktuelKonkurrence)
        {
            Konkurrence konkurrence = (Konkurrence)aktuelKonkurrence;
            List<IKategori> temp = new List<IKategori>();

            foreach (Kategori kategori in konkurrence.Kategorier)
            {
                temp.Add((IKategori)kategori);
            }

            return temp;
        }

        public void TilføjKategori(string navn, int maxPoint, IKonkurrence aktuelKonkurrence)
        {
            Konkurrence konkurrence = (Konkurrence)aktuelKonkurrence;
            konkurrence.TilføjKategori(navn, maxPoint);
        }

        public void FjernKategori(IKategori aktuelKategori)
        {
            aktuelKonkurrence.FjernKategori((Kategori)aktuelKategori);
        }

        #endregion

        #region Messe Metoder

        public void OpretMesse(string navn, string sted, string dato)
        {
            messeListe.OpretMesse(navn, sted, dato);
        }

        public void SletAktuelMesse(IMesse aktuelMesse)
        {
            messeListe.MesseSlet((Messe)aktuelMesse);
        }

        public List<IMesse> Messer()
        {
            return messeListe.HentMesser();
        }

        #endregion

        #region Konkurrence Metoder

        public List<IKonkurrence> HentKonkurrencer(IMesse aktuelMesse)
        {
            List<IKonkurrence> temp = new List<IKonkurrence>();
            Messe messe = (Messe)aktuelMesse;

            if (messe.KonkurrenceListe.Count > 0)
            {
                foreach (Konkurrence konkurrence in messe.KonkurrenceListe)
                {
                    temp.Add((IKonkurrence)konkurrence);
                }
            }

            return temp;
        }

        public void IndlæsCSV(string path, IMesse aktuelMesse)
        {
            Messe messe = (Messe)aktuelMesse;

            string[] csvLines = File.ReadAllLines(path);

            var csvQuery = from csvLine in csvLines
                           let data = csvLine.Split(';')
                           select new
                           {
                               StandNummer = data[0],
                               TeamNavn = data[1],
                               AnsvarligElev = data[2],
                               AnsvarligElevEmail = data[3],
                               Skole = data[4],
                               Underviser = data[5],
                               UnderviserEmail = data[6],
                               Konkurrence = data[7]
                           };
            
            //fjern header kolonnerne
            csvQuery = csvQuery.Where(e => e.StandNummer != csvQuery.First().StandNummer).ToArray();

            //opret konkurrencer
            List<string> konkurrencer = new List<string>();
            foreach (var team in csvQuery)
            {
                bool konkurrenceFindes = false;
                foreach (string konkurrence in konkurrencer)
                {
                    if (team.Konkurrence == konkurrence)
                    {
                        konkurrenceFindes = true;
                    }
                }
                if (!konkurrenceFindes)
                {
                    konkurrencer.Add(team.Konkurrence);
                    messe.TilføjKonkurrence(team.Konkurrence);
                }
            }

            //opret hold
            foreach (var team in csvQuery)
            {
                foreach (Konkurrence konkurrence in messe.KonkurrenceListe)
                {
                    if (team.Konkurrence == konkurrence.Navn)
                    {
                        konkurrence.TilføjTeam(int.Parse(team.StandNummer), team.TeamNavn, team.AnsvarligElev, team.AnsvarligElevEmail, team.Skole, team.Underviser, team.UnderviserEmail);
                    }
                }
            }

            YoungEnterpriseServices.DatabaseService dbService = new DatabaseService();
            
            int MesseID = dbService.FindMesse(aktuelMesse.Navn);

            //opret teams i database
            Dictionary<string, int> dct = new Dictionary<string, int>();
            foreach (var e in csvQuery)
            {
                
                if (dct[e.Konkurrence] != null)
                {
                    dct.Add(e.Konkurrence, dbService.OpretKonkurrence(e.Konkurrence, MesseID));
                }

                int teamid = dbService.OpretTeam(e.StandNummer, e.TeamNavn, e.AnsvarligElev, e.AnsvarligElevEmail, e.Skole, e.Underviser, e.UnderviserEmail);
                dbService.TilknytKonkurrenceTilTeam(teamid, dct[e.Konkurrence]);
            }
        }

        #endregion
    }
}
